/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2008，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	RWindowCmpst.java
 * 模块说明：	
 * 修改历史：
 * Feb 8, 2008 - lxm - 创建。
 */
package com.hd123.rumba.gwt.entry.client;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Frame;
import com.gwtext.client.core.Ext;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;

/**
 * 桌面空间 | 界面部件
 * <p>
 * 
 * 位于页面中央，其主要功能是提供一个用于运行个业务模块的iFrame。
 * 
 * @author lxm
 * 
 */
public class RWindowCmpst extends Panel {

  /**
   * 构造函数
   * 
   * @param entryPoint
   *            指定所属模块入口点。
   */
  public RWindowCmpst(MainFrame entryPoint) {
    super();
    this.setId(Ext.generateId());
    this.setTitle("窗口");
    this.setAutoScroll(true);
    this.setClosable(true);
    assert entryPoint != null;
    this.entryPoint = entryPoint;
    this.setWidth("100%");
    this.setHeight("100%");
    drawSelf();
  }
  
  public void navigate(String url) {
    try {
      this.entryPoint.getModuleNavigator().navigate2(url, frame);
    } catch (ClientBizException e) {
      MessageBox.alert(Window.getTitle(), "导航到指定地址过程中发生错误(" + url + ")。\n" + e.getMessage());
    }
  }

  /**
   * 页面导航到指定的url地址。
   * 
   * @param url
   *            指定的需要被导航到的url地址。支持相对路径。
   * @param style
   *            指定url的类型。
   */
  public void navigate(String url, int style) {
    try {
      this.entryPoint.getModuleNavigator().navigate2(url, frame, style);
    } catch (ClientBizException e) {
      MessageBox.alert(Window.getTitle(), "导航到指定地址过程中发生错误(" + url + ")。\n" + e.getMessage());
    }
    // setTitle(url);
  }

  /**
   * 取得所包含的Frame。
   * 
   * @return
   */
  public Frame getFrame() {
    return this.frame;
  }

  /**
   * 取得所包含Frame的id。
   * 
   * @return
   */
  public String getFrameId() {
    return DOM.getElementAttribute(frame.getElement(), "id");
  }

  private MainFrame entryPoint;

  /**  */
  private class RFrame extends Frame {
    public void onBrowserEvent(Event event) {
      super.onBrowserEvent(event);

      switch (DOM.eventGetType(event)) {
      case Event.ONLOAD:
        // 目前情况下（gwt 1.4.61）以下代码不会被正确执行。（gwt bug）
        frame_onLoad();
        break;
      }
    }

    public native String getFrameTitle() /*-{
        try {
        var fraId = this.@com.hd123.rumba.gwt.entry.client.RWindowCmpst::getFrameId()();
        if (fraId)
        return $doc.frames(fraId).document.title.text;
        else
        return null;
        } catch (e) {
        return null;
        }
        }-*/;

    public Element getElement() {
      return super.getElement();
    }
  }

  private RFrame frame;

  private void drawSelf() {
    frame = new RFrame();
    frame.setHeight("100%");
    frame.setWidth("100%");
    DOM.setElementAttribute(frame.getElement(), "id", Ext.generateId());
    DOM.setElementAttribute(frame.getElement(), "frameBorder", "0");
    this.add(frame);
  }

  void frame_onLoad() {
    this.setTitle(frame.getFrameTitle());
  }

}
